---
type: tutorial
title: Envie seu primeiro script ao navegador
description: >-
  Tutorial: Construa seu primeiro blog Astro —

  Adicione interatividade no lado do cliente a sua navegação móvel com uma tag de script
  Astro
i18nReady: true
---
import Blanks from '~/components/tutorial/Blanks.astro';
import Box from '~/components/tutorial/Box.astro';
import Checklist from '~/components/Checklist.astro';
import MultipleChoice from '~/components/tutorial/MultipleChoice.astro';
import Option from '~/components/tutorial/Option.astro';
import PreCheck from '~/components/tutorial/PreCheck.astro';
import { Steps } from '@astrojs/starlight/components';

Vamos adicionar um menu hambúrguer para abrir e fechar seus links em tamnhos de tela móveis, que necessita de interatividade no lado do cliente!

<PreCheck>
  - Criar um componente de menu hambúrguer
  - Escrever um `<script>` para permitir visitantes do site abrirem e fecharem o menu de navegação
  - Mover seu JavaScript para seu arquivo `.js`
</PreCheck>

## Construa um componente Hambúrguer

Crie um componente `<Hamburguer />` para abrir e fechar sua navegação móvel.

<Steps>
1. Crie um arquivo chamado `Hamburguer.astro` em `src/components/`
  

2. Copie o seguinte código em seu componente. Isso irá representar o seu menu "hambúrguer" de 3-linhas para abrir e fechar seus links de navegação em dispositivos móveis. (Você vai adicionar os novos estilos CSS ao `global.css` posteriormente.)

    ```astro title="src/components/Hamburguer.astro"
    --- 
    ---
    <div class="hamburguer">
      <span class="line"></span>
      <span class="line"></span>
      <span class="line"></span>
    </div>
    ```

3. Coloque esse novo componente `<Hamburguer />` logo antes do seu componente `<Navigation />` em `Header.astro`. 

    <details>
    <summary>Me mostre o código!</summary>

    ```astro title="src/components/Header.astro" ins={2,7}
    ---
    import Hamburguer from './Hamburguer.astro';
    import Navigation from './Navigation.astro';
    ---
    <header>
      <nav>
        <Hamburguer />
        <Navigation />
      </nav>
    </header>
    ```
    </details>

4. Adicione os seguintes estilos ao seu componente Hambúrguer:

    ```css title="src/styles/global.css" ins={2-13, 56-58}
    /* estilos da navegação */
    .hamburguer {
      padding-right: 20px;
      cursor: pointer;
    }

    .hamburguer .line {
      display: block;
      width: 40px;
      height: 5px;
      margin-bottom: 10px;
      background-color: #ff9776;
    }

    .nav-links {
      width: 100%;
      top: 5rem;
      left: 48px;
      background-color: #ff9776;
      display: none;
      margin: 0;
    }

    .nav-links a {
      display: block;
      text-align: center;
      padding: 10px 0;
      text-decoration: none;
      font-size: 1.2rem;
      font-weight: bold;
      text-transform: uppercase;
    }

    .nav-links a:hover, a:focus {
      background-color: #ff9776;
    }

    .expanded {
      display: unset;
    }

    @media screen and (min-width: 636px) {
      .nav-links {
        margin-left: 5em;
        display: block;
        position: static;
        width: auto;
        background: none;
      }

      .nav-links a {
        display: inline-block;
        padding: 15px 20px;
      }

      .hamburguer {
        display: none;
      }
    }
    ```
</Steps>


## Escreva sua primeira tag de script

Seu cabeçalho ainda não é **interativo** pois ele não consegue responder as interações do usuário, como clicar no menu hambúrguer para mostrar ou esconder os links de navegação. 

Adicionar uma tag `<script>` fornece JavaScript no lado do cliente para "escutar" por um evento do usuário e então responder de acordo.

<Steps>
1. Adicione a seguinte tag `<script>` em `index.astro`, logo antes da tag de fechamento `</body>`.

    ```astro title="src/pages/index.astro" ins={2-6}
      <Footer />
      <script>
        document.querySelector('.hamburguer').addEventListener('click', () => {
          document.querySelector('.nav-links').classList.toggle('expanded');
        });
      </script>
    </body>
    ```

2. Verifique sua pré-visualização do navegador novamente em vários tamanhos, e verifique que você tem um menu de navegação funcional que é tanto responsivo ao tamanho da tela quanto responde a interação do usuário na página.
</Steps>

### Importando um arquivo `.js`

Ao invés de escrever seu JavaScript diretamente em cada página, você pode mover os conteúdos da sua tag `<script>` para seu próprio arquivo `.js` em seu projeto.

<Steps>
1. Crie `src/scripts/menu.js` (você terá que criar uma nova pasta `/scripts/`) e mova seu JavaScript para ela.

    ```js title="src/scripts/menu.js"
    document.querySelector('.hamburguer').addEventListener('click', () => {
      document.querySelector('.nav-links').classList.toggle('expanded');
    });
    ```

2. Substitua os conteúdos da tag `<script>` em `index.astro` com a seguinte importação de arquivo:

    ```astro title="src/pages/index.astro" ins={7} del={3-5}
      <Footer />
      <script>
        document.querySelector('.hamburguer').addEventListener('click', () => {
          document.querySelector('.nav-links').classList.toggle('expanded');
        });

        import "../scripts/menu.js";
      </script>
    </body>
    ```

3. Verifique a pré-visualização do seu navegador novamente em um tamanho de tela menor e verifique que o menu hambúrguer ainda abre e fecha seus links de navegação. 


4. Adicione o mesmo `<script>` por importação para suas outras duas páginas, `about.astro` e `blog.astro` e verifique que você tem um cabeçalho responsivo e interativo em cada página.

    ```astro title="src/pages/about.astro & src/pages/blog.astro" ins={2-4}
      <Footer />
      <script>
        import "../scripts/menu.js";
      </script>
    </body>
    ```
</Steps>

:::note[Aprendizado]
Você tinha utilizado algum JavaScript anteriormente para construir partes do seu site:

- Definir o título da sua página e cabeçalho dinamicamente
- Mapear através de uma lista de habilidades na página Sobre
- Mostrar elementos HTML condicionalmente

Esses comandos são todos executados em tempo de build para criar HTML estático para seu site, e então o código é "jogado fora." 

**O JavaScript e uma tag `<script>` é enviado para o navegador**, e é disponível para execução, baseado na interação do usuário como atualizar a página ou alternar uma entrada.
:::



<Box icon="question-mark">

### Teste seu conhecimento

1. Quando o Astro executa qualquer JavaScript escrito no frontmatter de um componente?
    <MultipleChoice>
      <Option>
       Astro nunca executa JavaScript
      </Option>
      <Option isCorrect>
        Em tempo de build
      </Option>
      <Option>
         Quando um visitante clica em um botão
      </Option>
    </MultipleChoice>

2. Opcionalmente, Astro pode enviar JavaScript para o navegador para permitir:
    <MultipleChoice>
      <Option>
        usuários a clicarem links da página
      </Option>
      <Option>
        tempos de carregamento mais rápidos
      </Option>
      <Option isCorrect>
        interatividade no lado do cliente
      </Option>
    </MultipleChoice>

3. O JavaScript no lado do cliente será enviado ao navegador do usuário quando ele é escrito ou importado:
    <MultipleChoice>
      <Option isCorrect>
        em tags `<script>`
      </Option>
      <Option>
        entre as cercas de código de um arquivo `.astro`
      </Option>
      <Option>
        em `global.css`
      </Option>
    </MultipleChoice>

</Box>

<Box icon="check-list">

## Checklist

<Checklist>
- [ ] Eu posso adicionar interatividade no lado do cliente com JavaScript em uma tag `<script>`.
- [ ] Eu posso importar um arquivo `.js` em uma tag `<script>`.
</Checklist>

</Box>

### Recursos

[Scripts no lado do cliente no Astro](/pt-br/guides/client-side-scripts/)
